#define E_IAP
#include "H/IAP.H"

/*****************************************************
*函数名称：void CODE_AREA_PAGE_ERASE(uchar R_PAGE)
*函数功能：CODE区擦除指定页,擦除后值为0
*入口参数：uchar R_PAGE 范围 0~255
*出口参数：void
*****************************************************/
void CODE_AREA_PAGE_ERASE(uchar R_PAGE)	 
{    
    IAP_UNLOCK();                   //IAP解锁
    IAPADRH=R_PAGE;  	
    IAPCON1=D_IAP_CODE_PAGE_ERASE;  //页擦除
    IAP_LOCK();                     //IAP加锁
}

/*****************************************************
*函数名称：void CODE_AREA_BLOCK_ERASE(uchar R_BLOCK)
*函数功能：CODE块擦除,只判地址的最高2位,擦除后值为0
*入口参数：uchar R_BLOCK  取值0~3
           取值0：擦除地址0x0000~0x0FFF
           取值1：擦除地址0x1000~0x1FFF
           取值2：擦除地址0x2000~0x2FFF
           取值3：擦除地址0x3000~0x3FFF
*出口参数：void
*****************************************************/
void CODE_AREA_BLOCK_ERASE(uchar R_BLOCK)	 
{
    IAP_UNLOCK();                      //IAP解锁
    IAPADRH=R_BLOCK<<6;                      
    IAPCON1=D_IAP_CODE_BLOCK_ERASE;    //块擦除
    IAP_LOCK();                        //IAP加锁
}

/*****************************************************
*函数名称：void CODE_AREA_PAGE_WRITE(uchar R_PAGE,uchar *P_DATA,uchar R_LENGTH)
*函数功能：CODE区批量写入一页，未指定值地址默认写0xFF
*入口参数：uchar R_PAGE 页号 范围0~255
          uchar *P_DATA 指向写入数据缓存地址
          uchar R_LENGTH 写入数据长度1~64
*出口参数：void
作者：XY
*****************************************************/
void CODE_AREA_PAGE_WRITE(uchar R_PAGE,uchar *P_DATA,uchar R_LENGTH)
{
    uchar i=0;
    IAP_UNLOCK();                   //IAP解锁
    IAPADRH=R_PAGE;                 //页号
    IAPADRL=0;  
    IAPCON1=D_IAP_CLEAR_PAGE_CACHE; //清除页缓存

    for(i=0;i<R_LENGTH;i++)
    {
       IAPDAT=*P_DATA++;            //写入数据
    }
//    for(; i < 64; i++)            //未指定值的地址默认0xFF
//    {
//       IAPDAT=0xFF;
//    }
    IAPCON1=D_IAP_CODE_PAGE_WRITER; //页烧录
    IAP_LOCK();                     //IAP加锁 
}

/*****************************************************
*函数名称：uchar CODE_AREA_8BIT_READ(uint R_ADDR)
*函数功能：CODE区读8bit数据
*入口参数：uint R_ADDR 读取数据的地址
*出口参数：uchar IAPDAT 读取的8bit数据
*****************************************************/
uchar CODE_AREA_8BIT_READ(uint R_ADDR)
{   
    R_ADDR=((R_ADDR>>6)<<8)+ (R_ADDR%64); //地址转换
    IAPADRH=R_ADDR>>8;
    IAPADRL=R_ADDR;
    IAPCON1=D_IAP_CODE_READ;
    return IAPDAT;
}

/*****************************************************
*函数名称：void CODE_AREA_MASS_READ(uint R_ADDR,uchar *P_DATA,uchar R_LENGTH)
*函数功能：CODE区批量读数据
*入口参数：uint R_ADDR 读取数据的首地址  范围0~0x3FFF
           uchar *P_DATA 指向存储数据首地址
           uchar R_LENGTH 数据长度
*出口参数：void
*****************************************************/
void CODE_AREA_MASS_READ(uint R_ADDR,uchar *P_DATA,uchar R_LENGTH)
{  
    uchar i=0; 
    R_ADDR=((R_ADDR>>6)<<8)+ (R_ADDR%64); //地址转换
    IAPADRH=R_ADDR>>8;
    IAPADRL=R_ADDR;

    for(i=0;i<R_LENGTH;i++)
    {
        IAPCON1=D_IAP_CODE_READ;
        *P_DATA++=IAPDAT;
    }   
}

/*****************************************************
*函数名称：void INF_AREA_MASS_READ(uint R_ADDR,uchar *P_DATA,uchar R_LENGTH)
*函数功能：INF区批量读数据
*入口参数：uint R_ADDR 读取数据的首地址  范围0~0xBF
           uchar *P_DATA 指向存储数据首地址
           uchar R_LENGTH 数据长度
*出口参数：void
*****************************************************/
void INF_AREA_MASS_READ(uint R_ADDR,uchar *P_DATA,uchar R_LENGTH)
{  
    uchar i=0; 
    R_ADDR=((R_ADDR>>6)<<8)+ (R_ADDR%64); //地址转换
    IAPADRH=R_ADDR>>8;
    IAPADRL=R_ADDR; 
    P_DATA=P_DATA+3;   
    for(i=0;i<R_LENGTH;i++)
    {
        IAPCON1=D_IAP_INF_READ;
        *P_DATA--=IAPDAT;
    }   
}
/*****************************************************
*函数名称：void IAP_UNLOCK(void)
*函数功能：IAP操作解锁
*入口参数：void
*出口参数：void
*****************************************************/
void IAP_UNLOCK(void)
{
    IAPTRI=0X48; //进入IAP MODE
    IAPTRI=0X65;
    IAPTRI=0X88;
}
/*****************************************************
*函数名称：void IAP_LOCK(void)
*函数功能：IAP操作加锁
*入口参数：void
*出口参数：void
*****************************************************/
void IAP_LOCK(void)
{
    IAPTRI=0X00;
}










